package org.korifey.ffbdd.api;

import java.util.List;

import org.korifey.ffbdd.api.op.IUnaryOperation;


public interface IBdd<T> {
	
	INode getRoot();
	IBddDomain getDomain();
	
	IBdd<T> injectElement(T value, int[] varIndex, boolean[] varValue);
	IBdd<T> injectNewElements(List<T> values);
	boolean isConst();
	
	<E> IBdd<E> applyUnary(IUnaryOperation<T, E> unaryOp);
	
	IBdd<T> restrict(int[] varIndex, boolean[] varValue);
	IBdd<T> rename(int[] oldIndex, int[] newIndex);
	IBdd<T> substitute(IBdd<T> replacement, T replacable);
	
	
	List<boolean[]> solveEquation(T value, int[] varIndex, ITraverseStrategy strategy);
	
	List<Integer> dependantVariables();
	List<INode> listNodes();
	void traverse(ITraverseStrategy strategy);
	
	void mark();
	void unmark();
}
